package pers.sen.cloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Map;

/**
 * @author Jason
 * @version 1.0.0
 * @date 2020/11/26 20:06
 * @Description TODO
 */
@RestController
public class ConsumerController {
    // 注入使用RestTemplate通过http连接调用远程服务
    @Autowired
    private RestTemplate restTemplate;

    // 使用客户端拉取服务信息（URL）
    @Autowired
    private DiscoveryClient discoveryClient;


    @GetMapping("/consumer/{username}")
    public Map findUser(@PathVariable String username) {
        // 构造远程访问的url：访问对应的提供者的Controller
//        String url = "http://127.0.0.1:9090/user/" + username;

//        // 通过服务id（app-name）拉取服务信息，服务可能为集群所以结果是list
//        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
//        // 获取第一个user-service的服务节点
//        ServiceInstance serviceInstance = instances.get(0);
//
//        // 获取该节点的详细信息
//        // 获取主机名
//        String host = serviceInstance.getHost();
//        // 获取端口号
//        int port = serviceInstance.getPort();
//        // 拼接获得调用地址
//        System.out.println("http://"+host+":"+port+"/user/"+username);
//
//        // 直接获取URL（http://host:port）
//        String url = serviceInstance.getUri().toString();
//
//        url += "/user/" + username;
//        System.out.println("调用访问的 url = " + url);

        // 使用Ribbon负载均衡是通过服务名称到Eureka注册中心中获取服务列表，通过算法进行计算分配到对应的服务节点
        String url = "http://user-service/user/" + username;

        // 使用RestTemplate发送请求访问
        Map map = restTemplate.getForObject(url, Map.class);
        System.out.println("map = " + map);
        return map;
    }

}
